Other places...
Assemply lessons
Lesson 1
Lesson 2
Lesson 3
Lesson 4
Lesson 5
Lesson 6
Lesson 7
Lesson 8
Lesson 9


Tools
Html Tester V 1.0
Code Encoder New

Vbcode
Under construction

Games
X & O الإصداره العربيه
X & O English Edition

Links
الفريق العربى
الموسوعه العربيه
شبكة فارس العامه
المطورون العرب
فجوال بيسك للعرب
الخبر كافيه
المهندس
www.vbzoom.com
Free vb codes
Linux for arabs
Free compilers
3alam el-computer
A good IT gate
www.ahliz.org


Mix
الدعاء
Site Packages
News(arabic)
My whispers
Site poles
About mrezzuz
Send feed-back

Ezzuz web site
الدرس الثامن 6/6/2003
    مقدمه

السلام عليكم ثانيةً ... تابعنا سوياً الدروس السابقه فى لغتنا المحببه الأسمبلى وتعرفنا على ماهى اللغه و خواصها و قدرتها ... تمام .!؟
وتعرفنا على كيفية التحكم فى سير البرامج و كيفية وضع الشروط و إختبار القيم . كما تعرفنا أيضاً على الدورات و أنواعها و تقنياتها .
سنتابع الدرس السابق (مواضيع متقدمه نسبياً ) فى الأسمبلى و سنتابع الدوال و الأوامر التى تتعامل مع السلاسل النصيه Strings وأيضا سنتعلم إنشاع أكثر من جزء Procedures وكيفية نقل البرنامج إليها و الرجوع منها . فهيا نبدأ,


(1)    التعامل مع السلاسل النصيه Strings:-

السلاسل النصيه هى من أهم البيانات التى نتعامل معها فى نظم الحاسب عموماً و فى لغات البرمجه خصوصاً . من الممكن التعامل معها على أنها بعض الأحرف المتتابعه و التعامل معها كما سبق بالدورات و التكرار إعتماداً على أن أى سلسله حرفية تتكون من عدة أحرف معلومة الطول ومتتابعه.ولكن الأسمبلى تمدنا ببعض الدوال التى تسهل علينا هذا التعامل و تقليل التعقيد و طول البرامج نسبياً .
من أهم هذه الدوال ما يلى :- [LODS],[STOS],[MOVS],[INS],[OUTS],[SCAS],[CMPS]

قبل البدء خذ إنتباهك من الأتى :-

  • DI ( Data Index/Distination Index ) is combined with the ES (Extra Segment) to reach the data place in memory which the distenation od data of the current string transfer instruction.
  • SI ( Stack Index/Source Index ) is combined with the DS (Data Segment) to reach the data place in memory which the source of data of the current string transfer instruction.
  • D (Direction Flag) which indecates the direction of the flow of the strings in the memory .
    • At D=0 then Auto-Increment will occur to DI,SI According to the size of the current data (Increment with 1 if byte,2 if word,4 if double word).
    • At D=1 then Auto-Decrement will occur to DI,SI According to same previous charactaristics.
    • [STD] Will Set the Direction Flag (D=1).
    • [CLD] Will Clear the Direction Flag (D=0).
  • You can't move a Immediate Value to Any Segment Register , So you Should First Move The Desired Value To AX and Hence,Move it Form AX to THE Segment.

سنتناول هذه الدوال بالتفصيل مع شرح أمثله :-


[LODS]

هذه الداله يمكنها التعامل مع أحجام من البيانات مختلفه مثلاً [LODSB] لنقل بايت , [LODSW] لنقل كلمه , [LODSD] لنقل كلمتان DOUBLE WORD .
- [LODSB] :- تنقل إلى AL محتويات المكان فى الذاكره المعنون ب [DS:[SI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بواحد مما يعنى أنها تقوم بالتالى : AL=DS:[SI] , SI = SI +- 1 .

- [LODSW] :- تنقل إلى AX محتويات المكان فى الذاكره المعنون ب [DS:[SI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بإثنان مما يعنى أنها تقوم بالتالى : AX=DS:[SI] , SI = SI +- 2 .

- [LODSD] :- تنقل إلى EAX محتويات الكان فى الذاكره المعنون ب [DS:[SI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بأربعه مما يعنى أنها تقوم بالتالى : EAX=DS:[SI] , SI = SI +- 4 .

من الجدير بالذكر :-

هناك داله للتكرار فى التعامل مع السلاسل النصيه تسمى [REB] , هذه الداله تعمل تكرار مثل LOOP بالضبط وتكرر عدد مرات ما فى CX ولها أيضاً حالات خاصه كتكرار بشرط مثل [REBE]/[REBNE] . ويمكن و ضع أسم الداله أمامها فقط مثل :- [REP STOSW] ولاحظ أن هذا الموضوع ينفع مع كل الدوال المذكوره أعلاه ماعدا [LODS]

مثال:-
;---------------------------------
CLD
MOV AX,0000H
MOV DS,AX           ;نحدد المقطع الذى نتعامل معه الأول
MOV CX,1000H           ;تحديد عدد مرات النقل التى سوف تتم
MOV SI,0           ;البدأ من أول مكان داخل المقطع
MOV AH,2H           ;التجهيز للطبع
START:
LODSB
MOV DL,AL           ;تجهيز الحرف الذى سوف يتم طبعه
INT 21H

REP START

END :
;---------------------------------
فى المثال : تم طبع أول 1000 حرف فى الذاكره و طبعاً الموضوع مش عايز تفسيير أكثر من كده .



[STOS]

هذه الداله تتعامل أيضاً مع الأنواع المذكوره أعلاه و بنفس الطريقه .مثل:-
- [STOSB] :- تنقل محتويات ال AL إلى المكان فى الذاكره المعنون ب [ES:[DI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بواحد مما يعنى أنها تقوم بالتالى : ES:[DI]=AL , DI = DI +- 1 .

- [STOSW] :- تنقل محتويات ال AX إلى المكان فى الذاكره المعنون ب [ES:[DI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بإثنان مما يعنى أنها تقوم بالتالى : ES:[DI]=AX , DI = DI +- 2 .

- [STOSD] :- تنقل محتويات ال EAX إلى الكان فى الذاكره المعنون ب [ES:[DI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بأربعه مما يعنى أنها تقوم بالتالى : ES:[DI]=EAX , DI = DI +- 4 .

مثال:-
;---------------------------------
CLD
MOV AX ,0B800H
MOV ES,AX           ;نحدد المقطع الذى نتعامل معه الأول
MOV DI,0           ;البدأ من أول مكان داخل المقطع
MOV CX,20*80           ;تحديد عدد مرات النقل التى سوف تتم
MOV AX,0720H           ;تحميل البيانات التى ستتم نسخها إلى الذاكره

REB STOSW           ;تكرار عملية النسخ

END:
;---------------------------------
هذا المثال يقوم بمسح الشاشه (20سطر *80 عمود ) عن طريق نقل القيمه 0720إلى كل الأماكن فى الذاكره التى تبدأ عند ([B800H:0000H]) وهذا المقطع هو مقطع الشاشه و هذا طبعا فى نظام الدوس فقط . ومن الجدير بالذكر هنا أن القيمه 0720 هى عباره عن جزأين , الجزء الأول 07 هو كود اللون الأبيض على الخلفيه السوداء فى نظام الدوس و الجزء الآخر 20H هو الأسكى كود للمسافه الفارغه .
الخلاصه : أننا نطبع فى ذاكره الشاشه المسافه الفارغه فى كل أماكن الشاشه و ذلك لمسح الشاشه بالكامل و هذا المثال مكافىء لأمر الدوس CLS .



[MOVS]

هذه الداله الوحيده فى جميع المعالجات من 8088 إلى بنتيوم 3 التى تسمح بعمليات النقل من مكان فى الذاكره إلى مكان آخر فى الذاكره .
خذ حذرك من الآتى : -

لا نستطيع عمل أى عمليات نقل أو غيره بحيث تستلزم من المعالج النظر ألى الذاكره مرتين . يعنى ...

This is Not Allowed : ( MOV [1000H],[2000H] ) ( ADD [0903H],[SI] ) ............


هذه الداله تعمل مثل سابقتها من حيث مساحات البيانات كما يلى :-

- [MOVSB] :- تستخدم فى نقل بايت من محتويات المكان فى الذاكره المعنون ب [ES:[DI إلى المكان المعنون ب [DS:[SI . ويتم ذيادة ال DI,SI بواحد أو نقصانهم بناءاً على علم الإتجاه D FLAG .
مما يعنى أنها تقوم بالأتى : ES:[DI] = DS:[SI] ; SI=SI +-2 ; DI = DI +- 2 .

- [MOVSW] :- تستخدم فى نقل كلمه من محتويات المكان فى الذاكره المعنون ب [ES:[DI إلى المكان المعنون ب [DS:[SI . ويتم ذيادة ال DI,SI بواحد أو نقصانهم بناءاً على علم الإتجاه D FLAG .
مما يعنى أنها تقوم بالأتى : ES:[DI] = DS:[SI] ; SI=SI +-2 ; DI = DI +- 2 .

- [MOVSD] :- تستخدم فى نقل كلمتان من محتويات المكان فى الذاكره المعنون ب [ES:[DI إلى المكان المعنون ب [DS:[SI . ويتم ذيادة ال DI,SI بواحد أو نقصانهم بناءاً على علم الإتجاه D FLAG .
مما يعنى أنها تقوم بالأتى : ES:[DI] = DS:[SI] ; SI=SI +-2 ; DI = DI +- 2 .

لاحظ : أنها تعمل بتكرار مع الأمر REP.

مثال :-
;---------------------------------
CLD
MOV AX,01000H
MOV DS,AX ;Source Segment
MOV AX,02000H
MOV ES,AX ;Distination Segment
MOV DI,0
MOV SI,0
MOV CX,64 * 1024D

REP MOVSW

END :
;---------------------------------
كما توقعتم , المثال يقوم بنسخ المقطع 1000 بالكامل إلى المقطع 2000 عن طريق تكرار نقل الكلمات عدد 64 KWORDS و هو مساحة المقطع الواحد كما تعلمون .



[INS]

ألم تتساءل أنه من المستحسن أن تكون هناك داله تتعامل مثل الدوال السابقه و تكون مهمتها إدخال أى بيانات من وحدات الإدخال المعروفه (الشاشه / الهارد ديسك مثلا ) .!!؟
هذه الداله تقوم بهذا العمل بتنظيم أكبر و مرونه أكثر و تتيح لك أيضاً التكرار عن طريق إستخدام REP Instruction .

شرح كيفية العمل :
  • يتم وضع عنوان وسيلة الإدخال التى سوف تستخدمها فى DX
  • تجهيز عنوان المكان فى الذاكره الذى سوف يستقبل البيانات فى [ES:[DI
  • تجهيز علم الإتجاه على حسب متطلبات البرنامج .
  • إختبار هل توجد بيانات حاضره فى وسيلة الإدخال أولاً قبل طلب هذه البيانات .
  • مكافئه للأتى : ES:[DI] = [DX] ; DI = DI +- 1
الداله تمكنك من نقل بايت عن طريق [INSB] , وإدخال كلمه بإستخدام [INSW] , وإدخال كلمتين بإستخدام [INSD] .
مثال :-
;---------------------------------
MOV DI,0
CLD
MOV AX,1000H
MOV ES,AX
MOV DX,3ACH           ;عنوان وسيلة الإدخال المستخدمه
MOV CX,100

REP INSB

END :
;---------------------------------
طبعاً سهل !!!.



[OUTS]

نقس طريقة الإدخال و لكن للإخراج و هنا نستخدم لعنوان المكان فى الذاكره موجود فى [DS:[SI كما توقعتم .

مثال :-
;---------------------------------
MOV SI,0
CLD
MOV AX,1000H
MOV DS,AX
MOV DX,3ACH           ; عنوان وسيلة الإدخال المستخدمه وليكن عنوان الهارد ديسك
MOV CX,512

REP OUTB

END :
;---------------------------------
المثال يمثل نقل بلوك بيانات من الذاكره [DS:[SI إلى الهارد ديسك .



[SCAS]

هذه الداله تقوم بمقارنة محتويات المكان فى الذاكره الذى عنوانه موجود فى [ES:[DI و محتويات الAL عند إستخدام [SCASB] , ويقارنها بمحتويات ال AX عند إستخدام [SCASW] , ويقارنها بمحتويات ال EAX عند إستخدام [SCASD] .وطبعاً هناك ذياده أو نقصان فى DI كماتعرفنا سابقاً.

مثال :-
;---------------------------------
CLD
MOV DI,0
MOV CX,2000
XOR AX,AX
MOV ES,AX

REBNE SCASW

END :
;سيحتوى على المكان الفارغ أو القصود البحث عنه أو سيحتوى فى حالتنا على 2000 بعد إنتهاء البحث DI
;---------------------------------
فى المثال نبحث فى أول 2000 مكان فى الذاكره عن أول مكان فارغ أو يحتوى على 0000H



[CMPS]

هذه الداله فعلاً عظيمه لأنها تقارن مكانان فى الذاكره فى أمر واحد و تتوقف مساحة هذا المكان على إستخدام الأمر [CMPSB] , [CMPSW] , [CMPSD] .

  • الأول يوضع فى [ES:[DI.
  • الثانى يوضع فى [DS:[SI.

    مثال
    ;---------------------------------
    CLD
    MOV DI,0
    MOV SI,0
    MOV CX,2000
    XOR AX,AX
    MOV ES,AX
    MOV AX,1000H
    MOV DS,AX

    REBE CMPSW

    END :
    ;---------------------------------



    إلى هنا ينتهى درس الأسمبلى الثامن وتعرفنا على الدوال و الأوامر التى تتعامل مع السلاسل النصيه و أرجو من الله أن يكون سهلاً و بسيطاً و أن يكون قدم شيئاً مفبداً و جديداً لأخواننا الأعزاء.
    ولا تنسونى من الدعاء يا أخوانى .
    والسلام عليكم و رحمة الله و بركاته

  • Send feed-back to webmaster@1t.2t.3t.4t.com
    Copy rights reserved to Ezzuz web site
    22 / 3 / 2003
    <<< Aseemply 7                         Assemply 8                         Assemply 9 >>>